package week7.hotel;

import java.io.PrintStream;

import week7.Formattering;

/**
 * Rekening, bestaande uit meerdere items.
 * Practicumopgave Programmeren 1.
 */
public class Rekening {
	/**
	 * De PrintStream die door deze rekening wordt gebruikt.
	 */
	private PrintStream stream;
	
	/**
	 * Variabele die het totaal bijhoudt
	 */
	private double totaal;
	
	/**
	 * Construeert een rekening, die de uitvoer naar een gegeven PrintStream stuurt.
	 * Als de PrintStream op null wordt gezet, vindt er geen uitvoer plaats.
	 * @param out Uitvoer waar de rekening op geprint wordt; of null als er geen uitvoer geprint dient te worden.
	 * @ensure getTotaal() == 0
	 */
	public Rekening(PrintStream out) {
		this.stream = out;
	}
	
	/**
	 * Voegt een item toe aan de rekening. Het item wordt op de uitvoer geprint
	 * (mits deze ingesteld is), en het bedrag wordt aan het totaal van deze rekening toegevoegd.
	 * @param item Het nieuw toe te voegen item
	 * @require item != null
	 * @ensure this.getTotaal() == old.getTotaal() + item.getBedrag()
	 */
	public void nieuwItem(Rekening.Item item) {
		this.totaal = this.getTotaal() + item.getBedrag(); //Voeg bedrag toe aan totaal
		if (stream != null) {
			stream.println(Formattering.printRegel(item.toString(), item.getBedrag()));
		}
	}
	
	/**
	 * Print het totaalbedrag van de rekening op de uitvoer, mits deze ingesteld is.
	 */
	public void sluitAf() {
		if (stream != null) {
			stream.println("_________________________________________");
			stream.println(Formattering.printRegel("Totaalbedrag", this.getTotaal()));
		}
	}
	
	/**
	 * Levert het totaalbedrag van deze rekening op.
	 * @ensure result >= 0
	 * @return double Het totaalbedrag
	 */
	public double getTotaal() {
		return this.totaal;
	}
	
	//---------------------------------Geneste interface---------------------------------
	public static interface Item {
		
		/**
		 * Levert het bedrag van dit item op
		 * @ensure result >= 0
		 */
		public double getBedrag();
	}
}
